#pragma once

#include <typedef.h>
#include <quaternion.hpp>

struct ptr_cmp_s
{
	bool operator()(const char* s1, const char* s2) const
	{
		return strcmp(s1, s2) < 0;
	}
};

// 获取程序所在目录
char* GetPrgPath(void);

// 获取程序所在目录下的文件名
char* GetPrgFilePath(const char* filename);

// 去掉字符串首尾空格
std::string StringTrimed(const std::string& str);

// 将socket设置成非阻塞方式进行通信
int SocketNonBlocking(int socketFd);

// 校验socket是否存活，活1, 死0
int SocketCheckAlive(int socketFd);

// 得到当前时间
int64_t CurrentTimeUs(void);

// 计算持续时间DT，每次计算之后，会将timeLast更新为当前时间
double CalcDuarTime(int64_t& timeLast);

// 计算持续时间DT
double CalcDiffTime(int64_t timeLast);

// 限幅
int LimitInt(int value, int min, int max);

// 限幅
float LimitFloat(float value, float min, float max);

// 限幅
double LimitDouble(double value, double min, double max);

// 向量限幅
Eigen::Vector3d LimitVector3d(Eigen::Vector3d val, Eigen::Vector3d min, Eigen::Vector3d max);

// 弧度转角度
double CoordArc2Angle(double arc);

// 弧度转角度
Eigen::Vector3d CoordArc2Angle(Eigen::Vector3d arc);

// 角度转弧度
double CoordAngle2Arc(double angle);

// 角度转弧度
Eigen::Vector3d CoordAngle2Arc(Eigen::Vector3d angle);

// 低通滤波
float FilterLowPass(float value, float& valPre, float filter);

// 低通滤波
double FilterLowPass(double value, double& valPre, double filter);

Eigen::Vector3d ConvertFromBodyToNED(Quaternion q, Eigen::Vector3d src);
